﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using GuRenFang.Service.Entity;
using GuRenFang.Service.IBiz;

namespace GuRenFang.Controllers
{
    public class ShowCaseController : Controller
    {

        private readonly IPhotosBiz _photosService;

        public ShowCaseController(IPhotosBiz photosService)
        {
            this._photosService = photosService;
        }

        [ChildActionOnly]
        //[OutputCache(Duration = 3600)]
        public PartialViewResult _category(string photoType)
        {
            ViewBag.PhotoType = photoType;
            List<string> model = new List<string>();
            System.IO.DirectoryInfo directoryInfo = new DirectoryInfo(Server.MapPath("~/UpFiles/"+photoType+"/"));
            if (!directoryInfo.Exists)
            {
                directoryInfo.Create();
            }
            DirectoryInfo[] subDirectoryInfos = directoryInfo.GetDirectories();
            if (subDirectoryInfos.Count() > 0)
            {
                foreach (DirectoryInfo subDirectoryInfo in subDirectoryInfos)
                {
                    model.Add(subDirectoryInfo.Name);
                }
            }
            
            return PartialView("_category", model);
        }

        public ActionResult PictorialPhoto(string category)
        {
            List<string> model = GetModel("~/UpFiles/写真/", category);
            return View(model);
        }

        [HttpPost]
        public ContentResult CreateFolder( string folder)
        {
            folder = Server.UrlDecode(folder);
            string result = "";
            try
            {
                folder = Request.MapPath("~" + folder);
                if (!Directory.Exists(folder))
                {
                    Directory.CreateDirectory(folder);
                }
                folder = folder + @"Thumbnail\";
                if (!Directory.Exists(folder))
                {
                    Directory.CreateDirectory(folder);
                }
                result = "1";
            }
            catch (Exception ex)
            {
                result=ex.Message;
            }

            return Content(result);
        }


        [HttpPost]
        public ContentResult Upload(HttpPostedFileBase FileData, string folder)
        {
            folder = Server.UrlDecode(folder);
            string result = "";
            if (null != FileData)
            {
                try
                {
                    result = Path.GetFileNameWithoutExtension(FileData.FileName);//获得文件名
                    string ext = Path.GetExtension(FileData.FileName);//获得文件扩展名
                    saveFile(FileData, folder, result,ext);//保存文件
                    result = result + ext;
                }
                catch
                {
                    result = "";
                }
            }
            return Content(result);
        }

        [NonAction]
        private void saveFile(HttpPostedFileBase postedFile, string folder, string fileName,string extName)
        {
            string phyPath = Request.MapPath("~" + folder );
            if (!Directory.Exists(phyPath))
            {
                Directory.CreateDirectory(phyPath);
            }
            try
            {
                string imgPath=phyPath + fileName+extName;
                string thumbnailPath = phyPath + @"\Thumbnail\"+ fileName + extName;
                postedFile.SaveAs(imgPath);
                MakeThumbnail(imgPath, thumbnailPath, 150, 150, "Cut");
            }
            catch (Exception e)
            {
                throw new ApplicationException(e.Message);

            }
        }

        /// <summary>
        /// 生成缩略图
        /// </summary>
        /// <param name="originalImagePath">源图路径（物理路径）</param>
        /// <param name="thumbnailPath">缩略图路径（物理路径）</param>
        /// <param name="width">缩略图宽度</param>
        /// <param name="height">缩略图高度</param>
        /// <param name="mode">生成缩略图的方式</param>
        public void MakeThumbnail(string originalImagePath, string thumbnailPath, int width, int height, string mode)
        {
            System.Drawing.Image originalImage = System.Drawing.Image.FromFile(originalImagePath);
            int towidth = width;
            int toheight = height;
            int x = 0;
            int y = 0;
            int ow = originalImage.Width;
            int oh = originalImage.Height;
            switch (mode)
            {
                case "HW"://指定高宽缩放（可能变形）
                    break;
                case "W"://指定宽，高按比例
                    toheight = originalImage.Height * width / originalImage.Width;
                    break;
                case "H"://指定高，宽按比例
                    towidth = originalImage.Width * height / originalImage.Height;
                    break;
                case "Cut"://指定高宽裁减（不变形）
                    if ((double)originalImage.Width / (double)originalImage.Height > (double)towidth / (double)toheight)
                    {
                        oh = originalImage.Height;
                        ow = originalImage.Height * towidth / toheight;
                        y = 0;
                        x = (originalImage.Width - ow) / 2;
                    }
                    else
                    {
                        ow = originalImage.Width;
                        oh = originalImage.Width * height / towidth;
                        x = 0;
                        y = (originalImage.Height - oh) / 2;
                    }
                    break;
                default:
                    break;
            }
            //新建一个bmp图片
            System.Drawing.Image bitmap = new System.Drawing.Bitmap(towidth, toheight);
            //新建一个画板
            System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bitmap);
            //设置高质量插值法
            g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
            //设置高质量,低速度呈现平滑程度
            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
            //清空画布并以透明背景色填充
            g.Clear(System.Drawing.Color.Transparent);
            //在指定位置并且按指定大小绘制原图片的指定部分
            g.DrawImage(originalImage, new System.Drawing.Rectangle(0, 0, towidth, toheight),
            new System.Drawing.Rectangle(x, y, ow, oh),
            System.Drawing.GraphicsUnit.Pixel);
            try
            {
                //以jpg格式保存缩略图
                bitmap.Save(thumbnailPath, System.Drawing.Imaging.ImageFormat.Jpeg);
            }
            catch (System.Exception e)
            {
                throw e;
            }
            finally
            {
                originalImage.Dispose();
                bitmap.Dispose();
                g.Dispose();
            }
        } 


        [HttpPost]
        public ActionResult UploadPhotos(FormCollection form)
        {
            string photosType = form["PhotoType"];
            Photos item = !string.IsNullOrEmpty(photosType) && photosType == "1"
                              ? (Photos) new WeddingPhoto()
                              : new PictorialPhoto();

            string isDisplayOnHomePage = form["IsDisplayOnHomePage"];
            item.IsDisplayOnHomePage = !string.IsNullOrEmpty(isDisplayOnHomePage);
            item.ImgPath = form["ImgPath"];
            item.ThumbnailPath = form["ThumbnailPath"];
            item.Title = form["Title"];
            item.Content = form["Content"];
            _photosService.Create(item);

            return View();
        }

        public ActionResult WeddingDress(string category)
        {
            List<string> model = GetModel("~/UpFiles/婚纱/", category);
            return View(model);

            //int totalRecord = 0;
            //return View(_photosService.GetWeddingPhotoByPages(out totalRecord, 1, 20, orderFiled: "ID"));
        }

        private List<string> GetModel(string xPath,string category)
        {
            if (string.IsNullOrEmpty(category))
            {
                System.IO.DirectoryInfo pictorialInfo = new DirectoryInfo(Server.MapPath(xPath));
                if (pictorialInfo.Exists)
                {
                    DirectoryInfo[] folders = pictorialInfo.GetDirectories();
                    if (folders.Count() > 0)
                    {
                        category = folders[0].Name;
                    }
                }
            }
            category = Server.UrlDecode(category);

            string filePath = xPath + category + "/";
            List<string> model = new List<string>();
            ViewBag.Category = category;
            ViewBag.Path = filePath;
            System.IO.DirectoryInfo directoryInfo = new DirectoryInfo(Server.MapPath(filePath));
            if (directoryInfo.Exists)
            {
                FileInfo[] fileInfos = directoryInfo.GetFiles();
                if (fileInfos.Count() > 0)
                {
                    foreach (FileInfo fileInfo in fileInfos)
                    {
                        model.Add(fileInfo.Name);
                    }
                }
            }
            return model;
        }

        //public ActionResult PictorialPhoto()
        //{
        //    //int totalRecord = 0;

        //    //return View(_photosService.GetPictorialPhotoByPages(out totalRecord, 1, 20, orderFiled: "ID"));
        //}

    }
}
